#define int long long int n, a, b; int v[55]; boolcmp(int x, int y){ return x > y; }
int C[55][55]; voidpreC()// 预处理出 C(x, x) 的数量。 { C[0][0] = 1; for (int i = 1; i <= 50; i++) { C[i][0] = 1; for (int j = 1; j <= i; j++) C[i][j] = C[i - 1][j] + C[i - 1][j - 1]; // 组合数基本性质。 } return ; }
signedmain() { scanf("%lld %lld %lld", &n, &a, &b); for (int i = 1; i <= n; i++) scanf("%lld", &v[i]); sort(v + 1, v + n + 1, cmp); preC();
int ave = 0; for (int i = 1; i <= a; i++) ave += v[i]; // 求初始 1 ~ A 的平均数。
int cnt = 0; int cntn = 0, cnta = 0; // 求 1 ~ n / 1 ~ A 中等于 v[A] 值的个数。 for (int i = 1; i <= n; i++) { if (v[i] == v[a]) cntn++; } for (int i = 1; i <= a; i++) { if (v[i] == v[a]) cnta++; }
// 开始计算方案数。 if (v[1] == v[a]) { // 如果 v[A] 与最大值相等,则将 A ~ B 个数区间所有的最大值方案取出(贪心)。 for (int i = a; i <= b; i++) cnt += C[cntn][i]; } else cnt = C[cntn][cnta]; // 如果不,则将 1 ~ A 中所有的 v[A] 替换的方案数。
printf("%lf\n%lld", (double)ave / a, cnt); return0; }